﻿



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Omu.ValueInjecter;
using Gisena.Models;
using System.EnterpriseServices;
using AppGISENA.ObjetosNegocio;
using Gisena.Models;
using Gisena.ServiciosRemotos;



namespace Gisena.ServiciosLocales
{
    public class UnidadProductivaServicios:IUnidadProductivaDataService 
    {
       //conexion al contexto de GISENA
        private BDGISENAEntities2 GisenaDb = new BDGISENAEntities2();
        //Conexion que trae datos de sofia plus

        private BDSOFIAEntities SofiaBD = new BDSOFIAEntities(); 
       
        ///IMPLEMENTACION DE SERVICIOS DE SOFIA PLUS
        /// <summary>
        /// Consultar en SOFIAPLUS
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public List<SOFIA> getUPSofiaRemotaById(string codup)
        {

           // var upsofiacod = SofiaBD.SOFIA.Find(codup);

           // return upsofiacod;

            var sofia = (from mysofia in SofiaBD.SOFIA
                         where mysofia.COD_UNIDAD_PROD== codup
                         select mysofia).ToList();
            return sofia;
            //DefaultIfEmpty(), tambien funciona
          

        }
        
        /// <summary>
        /// Adicionar la caracterizacion de la UP
        /// </summary>
        /// <param name="unidadproductivaBo"></param>
        /// <returns></returns>
        public void CreateUnidadProductiva(CaracterizacionBo unidadproductiva)
        {


          //  var transactionStatus = new TransactionStatus();
           var caractunidadproductiva = BuiltCaractUPDomain(unidadproductiva);
           GisenaDb.Caracterizacion_UP.Add(caractunidadproductiva);
            GisenaDb.SaveChanges();

          //  return transactionStatus;
            
        }
        /// <summary>
        /// crear unidad en Sofia_UP, luego de consultarla en Sofia
        /// </summary>
        /// <param name="upsofiaBo"></param>
        public void CreateUPSofia(UnidadProductivaSofiaBo upsofiaBo)
        {
            var caractupsofia = BuiltUPsofiaDomain(upsofiaBo);

            GisenaDb.UP_Sofia.Add(caractupsofia);
            GisenaDb.SaveChanges();
        }


        /// <summary>
        /// crear socio de Up luego de consultar en SofiaPlus
        /// </summary>
        /// <param name="socioup"></param>
        public void CreateSocio(socioBo socioup)
        {
            var socio = BuiltSocioUPDomain(socioup);
            GisenaDb.Socio.Add(socio);
            GisenaDb.SaveChanges();


        }


        public void CreateAsesor(asesorBO asesor)
        {

            var asesorup = BuilAsesorDomain(asesor);
            GisenaDb.Asesor.Add(asesorup);
            GisenaDb.SaveChanges();

        }
        /// <summary>
        /// listar todos los productos
        /// </summary>
        /// <returns></returns>

        public List<ProductosBO> GetProductos()
        {

            var productos = GisenaDb.Productos.ToList();
            return productos.Select(s => BuiltProductosBo(s)).ToList();
        }
        /// <summary>
        /// Borrar ProductoOfertado seleccionada por ID
        /// </summary>
        /// <param name="id"></param>
        public  void DeleteProductoOfertado(int id)
        {
          


            var productoOfertado = GisenaDb.Productos_Ofertados.Find(id);
          //  var entidadAborrar = BuiltSproductoOfertadoBo(entity);
            if (productoOfertado == null) return; // no encontrado. Asume que ya fue borrado
            GisenaDb.Productos_Ofertados.Remove(productoOfertado);
        }

        public productosOfertadosBO getProductoOfertadoByID(int codproductoOfertado)
        {

            var sofia = (from mysofia in GisenaDb.Productos_Ofertados
                         where mysofia.Id_Prod_Ofert == codproductoOfertado
                         select mysofia).SingleOrDefault();

            //DefaultIfEmpty(), tambien funciona
            if (sofia != null)
                return BuiltSproductoOfertadoBo(sofia);
            else
            {

                return null;
            }

        }

        /// <summary>
        /// listar Caracterizacion UP
        /// </summary>
        /// <returns></returns>
       public List<CaracterizacionBo> GetUPCaracterizacion()
        {

            var upsofia = GisenaDb.Caracterizacion_UP.ToList();
            return upsofia.Select(s => BuiltUPCaracterizadaBo(s)).ToList();
        }

      //  void CreateProductoOfertado(productosOfertadosBO productosofertados)
        public void CreateProductoOfertado(productosOfertadosBO productosofertados)
        {
            var productoofertado = BuiltProductosOfertadosDomain(productosofertados);
            GisenaDb.Productos_Ofertados.Add(productoofertado);
            GisenaDb.SaveChanges();
        }
        /// <sumymary>
        /// Listar los tipos de UP que existen
        /// </summary>
        /// <returns></returns>
        public List<TipoUPBO> GetTipoUP()
        {
            var tipoUP = GisenaDb.Tp_UP.ToList();

            return tipoUP.Select(s => BuiltTipoProductivaBo(s)).ToList();
        }


         //<summary>
         //listar los estados que puede tener un UP
         //</summary>
         //<returns></returns>
        public List<EstadoUPBO> GetEstadoUP()
        {
            var estadosUP = GisenaDb.Estado_UP.ToList();

            return estadosUP.Select(s => BuiltEStadoUPBo(s)).ToList();
        }

        /// <summary>
        /// obtener unidad productiva
        /// </summary>
        /// <returns></returns>
        public List<UnidadProductivaSofiaBo> GetUpSofia(){

            var upsofia = GisenaDb.UP_Sofia.ToList();
            return upsofia.Select(s => BuiltUPSofiaBo(s)).ToList();
        
        }

        /// <summary>
        /// implementacion de buscar Up obtenida de SofiaPlus y guardada en UP_Sofia de GISENA, por Codigo de UP 
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public UP_Sofia getUPSofiaById(long codup)
        {

           
            var sofia = (from mysofia in GisenaDb.UP_Sofia
                         join mycaract in GisenaDb.Caracterizacion_UP on mysofia.Cod_UP equals mycaract.Cod_UP
                         where mysofia.Cod_UP == codup
                         select mysofia).FirstOrDefault();
            
           
            if(sofia!=null)
            return sofia;
            else
            {

                return null;
            }


        }

        public List<UP_Sofia> getListUPSofiaById(long codup)
        {


            var UPSofialista = (from mysofia in GisenaDb.UP_Sofia
                         join mycaract in GisenaDb.Caracterizacion_UP on mysofia.Cod_UP equals mycaract.Cod_UP
                         where mysofia.Cod_UP == codup
                         select mysofia).ToList();


            if (UPSofialista != null)
                return UPSofialista;
            else
            {

                return null;
            }


        }


        /// <summary>
        /// buscar en Sofia Plus
        /// </summary>
        /// <param name="CodUP"></param>
        /// <returns></returns>
        public asesorBO GetAsesorByCodUP(long CodUP)
        {

            //var asesor = (from myasesor in SofiaDB.Socio
            //             where myasesor.CodUP == CodUP
            //             select myasesor).SingleOrDefault();

            ////DefaultIfEmpty(), tambien funciona
            //if ( asesor  != null)
            //    return BuiltUPSofiaBo( asesor );
            //else
            //{

            //    return null;
            //}
            throw new NotImplementedException();

        }

        //public productosOfertadosBO getproductoOfertadoById(long codUp)
        //{
           



        //    var myproducto = (from myproducofertado in GisenaDb.Productos_Ofertados
        //                      join productos in GisenaDb.Productos on myproducofertado.Id_Prod equals productos.Id_Prod
        //                      join tipoproducto in GisenaDb.Tipo_Producto on productos.Id_Tp_Prod equals tipoproducto.Id_Tp_Prod
        //                      where myproducofertado.Cod_UP == codUp
        //                      select new
        //                      {

        //                          Idproducto = productos.Id_Prod,
        //                          nombreproducto = productos.Nomb_Prod,
        //                          descripcion = productos.Descrip,
        //                          principal = myproducofertado.Principal,
        //                          nombretipoproduc = tipoproducto.Nombre



        //                      });

        //    return BuiltProductosOfertadosDomain(myproducto.ToList().FirstOrDefault());
        //}
        /// <summary>
        /// implementacion de buscar unidad productiva caracterizada por Codigo de Up
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public CaracterizacionBo getUPCaracterizadaById(long codup)
        {
            //var upsofiacod = GisenaDb.Caracterizacion_UP.Find(codup);

            //return BuiltUPCaracterizadaBo(upsofiacod);



            var caracUP = (from mycaract in GisenaDb.Caracterizacion_UP
                           join mysofiaup in GisenaDb.Caracterizacion_UP on mycaract.Cod_UP equals mysofiaup.Cod_UP
                           where mycaract.Cod_UP == codup
                           select mycaract).FirstOrDefault();


            if (caracUP != null)
                return BuiltUPCaracterizadaBo(caracUP);
            else
            {

                return null;
            }


        }
        public List<categoriaBO> GetCategoriaUP()
        {
            throw new NotImplementedException();
        }

        public List<productosOfertadosBO> GetProductoUP()
        {

            throw new NotImplementedException();
            
            
            
            //throw new NotImplementedException();
        }
        
        /// <summary>
        /// inyectar entidad Caracterizacion_UP
        /// </summary>
        /// <param name="unidadproductivaBo"></param>
        /// <returns></returns>
        private Caracterizacion_UP BuiltCaractUPDomain(CaracterizacionBo unidadproductivaBo)
        {
            return (Caracterizacion_UP)new Caracterizacion_UP().InjectFrom(unidadproductivaBo);
        }


        private CaracterizacionBo BuiltUPCaracterizadaBo(Caracterizacion_UP unidadproductiva)
        {
            return (CaracterizacionBo)new CaracterizacionBo().InjectFrom(unidadproductiva);
        }
        private TipoUPBO BuiltTipoProductivaBo(Tp_UP tipounidadproductiva)
        {
            return (TipoUPBO)new TipoUPBO().InjectFrom(tipounidadproductiva);
        }

        private EstadoUPBO BuiltEStadoUPBo(Estado_UP estadoup)
        {
            return (EstadoUPBO)new EstadoUPBO().InjectFrom(estadoup);
        }

           


        private Productos_Ofertados BuiltProductosOfertadosDomain(productosOfertadosBO productoofertadoBo)
        {
            return (Productos_Ofertados)new Productos_Ofertados().InjectFrom(productoofertadoBo);
        }


        private productosOfertadosBO BuiltSproductoOfertadoBo(Productos_Ofertados productoofertado)
        {
            return (productosOfertadosBO)new productosOfertadosBO().InjectFrom(productoofertado);
        }

        private ProductosBO BuiltProductosBo(Productos productosbo)
        {

            return (ProductosBO)new ProductosBO().InjectFrom(productosbo);

        }

        private Productos BuiltProductoDomain(ProductosBO producto)
        {

            return (Productos)new Productos().InjectFrom(producto);

        }
        ///// <summary>
        ///// inyectar UP_sofia
        ///// </summary>
        ///// <param name="upsofiabo"></param>
        ///// <returns></returns>
        private UnidadProductivaSofiaBo BuiltUPSofiaBo(UP_Sofia upsofiabo)
        {
            return (UnidadProductivaSofiaBo)new UnidadProductivaSofiaBo().InjectFrom(upsofiabo);
        }

        private UP_Sofia BuiltUPsofiaDomain(UnidadProductivaSofiaBo unidadsofiabo)
        {

            return (UP_Sofia)new UP_Sofia().InjectFrom(unidadsofiabo);
        }

        /// <summary>
        /// inyectar socio
        /// </summary>
        /// <param name="socioup"></param>
        /// <returns></returns>
        private Socio BuiltSocioUPDomain(socioBo socioup)
        {

            return (Socio)new Socio().InjectFrom(socioup);

        }

        /// <summary>
        /// inyectar Asesor
        /// </summary>
        /// <param name="asesorup"></param>
        /// <returns></returns>
        private Asesor BuilAsesorDomain(asesorBO asesorup)
        {

            return (Asesor)new Asesor().InjectFrom(asesorup);
        }



       
      



        /// <summary>
        /// CONSULTAR en SOFIA INSTRUCTOR
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>

      //public InstructorSet getInstructorSofiaByCodUP(string codup)
      //  {

      //      var myinstsofia = (from myInstrusofia in SofiaBD.InstructorSet
      //                         where myInstrusofia.COD_UNIDAD_PROD == codup
      //                         select myInstrusofia).SingleOrDefault();

      //      //DefaultIfEmpty(), tambien funciona
      //      if (myinstsofia != null)
      //          return myinstsofia;
      //      else
      //      {
      //          return null;
      //      }

      //  }


        /// <summary>
        /// CONSULTAR EN SOFIA APRENDIZ
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>

        //    public IQueryable getAprendizSofiaByCodUP(string codup)
        //{
        //    var myaprensofia = (from myAprendizsofia in SofiaBD.SOFIA
        //                        where myAprendizsofia.COD_UNIDAD_PROD == codup
        //                        select  new
        //                              {
        //                                 Ident = myAprendizsofia.DOC_ID,
        //                                 Nombre = myAprendizsofia.NOMBRE_APRENDIZ,
        //                                 apellido = myAprendizsofia.APELLIDOS_APRENDIZ,
        //                                 tipodocumento = myAprendizsofia.TIPO_DOCUMENTO,
        //                                 nombrelider = myAprendizsofia.LIDER,
        //                                 identificacionlider=myAprendizsofia.NUM_DOC_LIDER,
        //                                 ficha=myAprendizsofia.FICHA,                                         
        //                                 tipoblacion=myAprendizsofia.TIPO_POBLACION

        //                              });
        //    return myaprensofia;
          
        //}








     
    }
}
